package me.arin.jacass.serializer.testutil;
import org.apache.cassandra.contrib.utils.service.CassandraServiceDataCleaner;
import org.apache.cassandra.io.util.FileUtils;
import org.apache.cassandra.service.EmbeddedCassandraService;
import org.apache.thrift.transport.TTransportException;
import java.io.*;
/**
* Jacked from Hector: http://github.com/rantav/hector
*/
public class EmbeddedServerHelper {
private static final String TMP = "tmp";
private EmbeddedCassandraService cassandra;
private String baseDir;
private static String testResourceDir;
public EmbeddedServerHelper(String baseDir) {
this.baseDir = baseDir;
testResourceDir = this.baseDir + "/src/test/resources";
}
/**
* Set embedded cassandra up and spawn it in a new thread.
*
* @throws org.apache.thrift.transport.TTransportException
*
* @throws java.io.IOException
* @throws InterruptedException
*/
public void setup() throws TTransportException, IOException, InterruptedException {
// delete tmp dir first
rmdir(TMP);
// make a tmp dir and copy storag-conf.xml and log4j.properties to it
copy("/storage-conf.xml", TMP);
copy("/log4j.properties", TMP);
System.setProperty("storage-config", TMP);
CassandraServiceDataCleaner cleaner = new CassandraServiceDataCleaner();
cleaner.prepare();
cassandra = new EmbeddedCassandraService();
cassandra.init();
Thread t = new Thread(cassandra);
t.setDaemon(true);
t.start();
}
public void teardown() throws IOException {
CassandraServiceDataCleaner cleaner = new CassandraServiceDataCleaner();
cleaner.cleanupDataDirectories();
rmdir(TMP);
}
private static void rmdir(String dir) throws IOException {
File dirFile = new File(dir);
if (dirFile.exists()) {
FileUtils.deleteDir(new File(dir));
}
}
/**
* Copies a resource from within the jar to a directory.
*
* @param resource
* @param directory
* @throws IOException
*/
private static void copy(String resource, String directory) throws IOException {
mkdir(directory);
InputStream is = new FileInputStream(testResourceDir + resource);
String fileName = resource.substring(resource.lastIndexOf("/") + 1);
File file = new File(directory + System.getProperty("file.separator") + fileName);
OutputStream out = new FileOutputStream(file);
byte buf[] = new byte[1024];
int len;
while ((len = is.read(buf)) > 0) {
out.write(buf, 0, len);
}
out.close();
is.close();
}
/**
* Creates a directory
*
* @param dir
* @throws IOException
*/
private static void mkdir(String dir) throws IOException {
FileUtils.createDirectory(dir);
}
}